home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / arglist2.pas < prev    next >
Pascal/Delphi Source File  |  1985-06-03  |  4KB  |  121 lines

  1. { This provides capabilities similar to argc/argv in C. You can now
  2.   read the argument list from your TURBO Pascal program. `argc' is
  3.   actually a function that returns the number of parameters on the
  4.   command line. Spaces are the separators between parameters. If the
  5.   parameter is enclosed in quotes ('), then any characters can appear.
  6.   If you want a quote, put two in the command line parameter.
  7.  
  8. Example
  9.  
  10.     cmd 'this is the first' and 'this is the ''third'' argument'
  11.  
  12. This will return argc=3.
  13.  
  14. You can retrieve the arguments by calling argv(#)
  15.  
  16. Example
  17.    if the above was the command line, then the program
  18.  
  19.       for i := 1 to argc do
  20.          writeln('argv(',i,') =<',argv(i),'>');
  21.  
  22. would print
  23.  
  24.     argv(1) =<this is the first>
  25.     argv(2) =<and>
  26.     argv(3) =<this is the 'third' argument>
  27.  
  28. }
  29.  
  30. type
  31.     arglist_string = string[80];
  32. const
  33.     arglist_max = 20;
  34.     arglist_number : integer = -1;
  35. var
  36.     argvlist : array[1..arglist_max] of ^arglist_string;
  37. function argv(num : integer) : arglist_string;
  38.  
  39. var
  40.     argument : arglist_string absolute cseg:$80;
  41.     newparm,parmline : arglist_string;
  42.     i,j : integer;
  43.     state : (leading_ws, non_quote, quoted, end_quote);
  44.     inchar : char;
  45.  
  46.     procedure saveparm;
  47.     begin
  48.       if arglist_number < arglist_max then begin
  49.         arglist_number := arglist_number+1;
  50.         new(argvlist[arglist_number]);
  51.         argvlist[arglist_number]^ := newparm;
  52.         newparm := '';
  53.         end;
  54.       end;
  55.  
  56. begin
  57.     if arglist_number = -1 then begin
  58.         arglist_number := 0;
  59.         parmline := argument+' ';
  60.         state := leading_ws;
  61.         newparm := '';
  62.         for i := 1 to length(parmline) do begin
  63.             inchar := parmline[i];
  64.             case state of
  65.  
  66.                 leading_ws: begin
  67.                     if inchar = '''' then state := quoted
  68.                     else if inchar <> ' ' then begin
  69.                         newparm := newparm+inchar;
  70.                         state := non_quote;
  71.                         end;
  72.                     end;
  73.  
  74.                 non_quote: begin
  75.                     if inchar = ' ' then begin
  76.                         saveparm;
  77.                         state := leading_ws;
  78.                         end
  79.                     else newparm := newparm+inchar;
  80.                     end;
  81.  
  82.                 quoted: begin
  83.                     if inchar = '''' then state := end_quote
  84.                     else newparm := newparm+inchar;
  85.                     end;
  86.  
  87.                 end_quote: begin
  88.                     if inchar = '''' then begin
  89.                         newparm := newparm+inchar;
  90.                         state := quoted;
  91.                         end
  92.                     else if inchar <> ' ' then begin
  93.                         newparm := newparm+inchar;
  94.                         state := non_quote;
  95.                         end
  96.                     else begin
  97.                         saveparm;
  98.                         state := leading_ws;
  99.                         end;
  100.                 end;
  101.             end;
  102.         end;
  103.         end;
  104.     if (num > 0) and (num <= arglist_number) then
  105.         argv := argvlist[num]^
  106.     else argv := '';
  107.     end;
  108.  
  109. function argc : integer;
  110. var
  111.     dummy : arglist_string;
  112.  
  113. begin
  114.     if arglist_number = -1 then dummy := argv(1); {force evaluation}
  115.     argc := arglist_number;
  116.     end;
  117. egin
  118.     if arglist_number = -1 then dummy := argv(1); {force evaluation}
  119.     argc := arglist_number;
  120.     end;
  121.